289577660c55a80baada1ca397c10af980464f9f,src/main/java/com/cronutils/model/time/ExecutionTime.java,ExecutionTime,nextClosestMatch,#DateTime#,139
Before Change
int nextMonths = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
new DateTime(date.getYear(), 1, 1, 0, 0, 0, date.getZone()).plusYears(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getMonthOfYear()) {
date = date.plusYears(1);
}
days = generateDays(cronDefinition, new DateTime(date.getYear(), nextMonths, 1, 0, 0));
return initDateTime(date.getYear(), nextMonths, days.getValues().get(0), lowestHour, lowestMinute, lowestSecond, date.getZone());
}
days = generateDays(cronDefinition, date);
if(!days.getValues().contains(date.getDayOfMonth())) {
nearestValue = days.getNextValue(date.getDayOfMonth(), 0);
if(nearestValue.getShifts()>0){
newDate = new DateTime(date.getYear(), date.getMonthOfYear(), 1, 0, 0, 0, date.getZone()).plusMonths(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getDayOfMonth()) {
date = date.plusMonths(1);
}
return initDateTime(date.getYear(), date.getMonthOfYear(), nearestValue.getValue(), lowestHour, lowestMinute, lowestSecond, date.getZone());
}
if(!hours.getValues().contains(date.getHourOfDay())) {
nearestValue = hours.getNextValue(date.getHourOfDay(), 0);
int nextHours = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
new DateTime(date.getYear(), date.getMonthOfYear(),
date.getDayOfMonth(), 0, 0, 0, date.getZone()).plusDays(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getHourOfDay()) {
date = date.plusDays(1);
}
return initDateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), nextHours, lowestMinute, lowestSecond, date.getZone());
}
if(!minutes.getValues().contains(date.getMinuteOfHour())) {
nearestValue = minutes.getNextValue(date.getMinuteOfHour(), 0);
int nextMinutes = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
new DateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), date.getHourOfDay(),
0, 0, date.getZone()).plusHours(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getMinuteOfHour()) {
date = date.plusHours(1);
}
return initDateTime(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth(), date.getHourOfDay(), nextMinutes, lowestSecond, date.getZone());
}
if(!seconds.getValues().contains(date.getSecondOfMinute())) {
nearestValue = seconds.getNextValue(date.getSecondOfMinute(), 0);
int nextSeconds = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
new DateTime(date.getYear(), date.getMonthOfYear(),
date.getDayOfMonth(), date.getHourOfDay(),
date.getMinuteOfHour(),0, date.getZone()).plusMinutes(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getSecondOfMinute()) {
After Change
* @return ZonedDateTime instance, never null. Value obeys logic specified above.
* @throws NoSuchValueException
*/
ZonedDateTime nextClosestMatch(ZonedDateTime date) throws NoSuchValueException {
List<Integer> year = yearsValueGenerator.generateCandidates(date.getYear(), date.getYear());
TimeNode days = null;
int lowestMonth = months.getValues().get(0);
int lowestHour = hours.getValues().get(0);
int lowestMinute = minutes.getValues().get(0);
int lowestSecond = seconds.getValues().get(0);
NearestValue nearestValue;
ZonedDateTime newDate;
if(year.isEmpty()){
int newYear = yearsValueGenerator.generateNextValue(date.getYear());
days = generateDays(cronDefinition, ZonedDateTime.of(LocalDateTime.of(newYear, lowestMonth, 1, 0, 0), date.getZone()));
return initDateTime(yearsValueGenerator.generateNextValue(date.getYear()), lowestMonth, days.getValues().get(0), lowestHour, lowestMinute, lowestSecond, date.getZone());
}
if(!months.getValues().contains(date.getMonthValue())) {
nearestValue = months.getNextValue(date.getMonthValue(), 0);
int nextMonths = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
ZonedDateTime.of(LocalDateTime.of(date.getYear(), 1, 1, 0, 0, 0), date.getZone()).plusYears(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getMonthValue()) {
date = date.plusYears(1);
}
days = generateDays(cronDefinition, ZonedDateTime.of(LocalDateTime.of(date.getYear(), nextMonths, 1, 0, 0), date.getZone()));
return initDateTime(date.getYear(), nextMonths, days.getValues().get(0), lowestHour, lowestMinute, lowestSecond, date.getZone());
}
days = generateDays(cronDefinition, date);
if(!days.getValues().contains(date.getDayOfMonth())) {
nearestValue = days.getNextValue(date.getDayOfMonth(), 0);
if(nearestValue.getShifts()>0){
newDate = ZonedDateTime.of(LocalDateTime.of(date.getYear(), date.getMonthValue(), 1, 0, 0, 0), date.getZone()).plusMonths(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getDayOfMonth()) {
date = date.plusMonths(1);
}
return initDateTime(date.getYear(), date.getMonthValue(), nearestValue.getValue(), lowestHour, lowestMinute, lowestSecond, date.getZone());
}
if(!hours.getValues().contains(date.getHour())) {
nearestValue = hours.getNextValue(date.getHour(), 0);
int nextHours = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
ZonedDateTime.of(LocalDateTime.of(date.getYear(), date.getMonthValue(),
date.getDayOfMonth(), 0, 0, 0), date.getZone()).plusDays(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getHour()) {
date = date.plusDays(1);
}
return initDateTime(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), nextHours, lowestMinute, lowestSecond, date.getZone());
}
if(!minutes.getValues().contains(date.getMinute())) {
nearestValue = minutes.getNextValue(date.getMinute(), 0);
int nextMinutes = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
ZonedDateTime.of(LocalDateTime.of(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), date.getHour(),
0, 0), date.getZone()).plusHours(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getMinute()) {
date = date.plusHours(1);
}
return initDateTime(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), date.getHour(), nextMinutes, lowestSecond, date.getZone());
}
if(!seconds.getValues().contains(date.getSecond())) {
nearestValue = seconds.getNextValue(date.getSecond(), 0);
int nextSeconds = nearestValue.getValue();
if(nearestValue.getShifts()>0){
newDate =
ZonedDateTime.of(LocalDateTime.of(date.getYear(), date.getMonthValue(),
date.getDayOfMonth(), date.getHour(),
date.getMinute(),0), date.getZone()).plusMinutes(nearestValue.getShifts());
return nextClosestMatch(newDate);
}
if (nearestValue.getValue() < date.getSecond()) {